package info.motteke.mybws.utils;

import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/**
 * リストの要素を逆順に取得するためのクラスです。
 * 
 * @author YWak
 * 
 * @param <T>
 *            リストの要素
 */
public class ListReverser<T> implements Iterable<T> {

    /** 逆順にするリスト */
    private final List<T> list;

    /**
     * 逆順にするリストを持つインスタンスを生成します。
     * 
     * @param list
     *            逆順にするリスト
     * @throws NullPointerException
     *             listがnullの場合
     */
    public ListReverser(List<T> list) {
        if (list == null) {
            throw new NullPointerException("list can't be null");
        }

        this.list = list;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Iterator<T> iterator() {

        return new Iterator<T>() {
            
            // 初期化時は最後の要素を指している
            private final ListIterator<T> itr = list.listIterator(list.size());

            @Override
            public boolean hasNext() {
                // 前の要素があるかどうか
                return itr.hasPrevious();
            }

            @Override
            public T next() {
                // 前の要素を返す
                return itr.previous();
            }

            @Override
            public void remove() {
                // remove()はprevious()に対応している。
                itr.remove();
            }
        };
    }
}
